class Hash {
    constructor() {  
      // 哈希表
      this.map = [];
      // 当前hash表有值的个数
      this.size = 0;
      //hash表的最长长度为64   
      this.max = 64;
    }

    // 获取map数组的下标
    getHash(key) {
      let code = 0;
      for (let i = 0; i < key.length; i++) {
        code += key.charCodeAt(i);
      }
      return code % this.max;
    }

    // 向hash表里面设置值
    // key => map数组的下标 => map中的值
    set(key, val) {
      // 判断个数超过哈希表最大的长度，直接返回false 
      if (this.size >= this.max) {
        return false;
      }
      // 获取hash表下标
      let index = this.getHash(key);
      // 如果有重复的hash下标就往后移一位
      while (this.map[index]) {
        index = (index + 1) % this.max;
      }
      this.map[index] = val;
      this.size++;
    }

    // 判断改hash表是否有值
    has(key) {
      return !!this.map[this.getHash(key)];
    }

    // 通过key值获取hash的值
    get(key) {
      return this.map[this.getHash(key)];
    }

    // 删除hash表里的key值
    delete(key) {
      if (this.has(key)) {
        this.map[this.getHash(key)] = undefined;
        this.size--;
      }
    }

    // 清空hash表
    clear() {
      this.map = [];
      this.size = 0;
    }
}
